/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package coba.service.impl;



import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;

import coba.NoSuchSolicitudException;
import coba.NoSuchRecorridoException;
import coba.model.ConcurrenciaRecorrido;
import coba.model.SolicitudItinerario;
import coba.model.ItinerarioRecorrido;
import coba.model.Solicitud;
import coba.service.base.SolicitudItinerarioLocalServiceBaseImpl;
import coba.service.SolicitudLocalServiceUtil;

import java.util.Date;
import java.util.List;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
import java.util.Calendar;
import java.util.GregorianCalendar;


/**
 * The implementation of the R local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link coba.service.SolicitudItinerarioLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM.
 * </p>
 *
 * @author rodri042
 * @see coba.service.base.SolicitudItinerarioLocalServiceBaseImpl
 * @see coba.service.SolicitudItinerarioLocalServiceUtil
 */
public class SolicitudItinerarioLocalServiceImpl
	extends SolicitudItinerarioLocalServiceBaseImpl {

	public SolicitudItinerario add(long solicitudId, long itinerarioId, Date fecha, Date fechaAlta, long usuarioAlta)
			throws SystemException, NoSuchSolicitudException {

		SolicitudItinerario solicitudItinerario = solicitudItinerarioPersistence.
				create(counterLocalService.increment(SolicitudItinerario.class.getName()));

		solicitudItinerario.setSolicitudId(solicitudId);
		solicitudItinerario.setItinerarioId(itinerarioId);
		solicitudItinerario.setFecha(fecha);
		solicitudItinerario.setFechaAlta(fechaAlta);
		solicitudItinerario.setUsuarioAlta(usuarioAlta);

		super.addSolicitudItinerario(solicitudItinerario);

		Solicitud solicitud = solicitudPersistence.findByPrimaryKey(solicitudId);
		
		solicitud.setFechaAsignacionItinerario(fecha);
		
		solicitudPersistence.update(solicitud);

		for (ItinerarioRecorrido itinerarioRecorrido : itinerarioRecorridoPersistence.findByItinerarioId(itinerarioId)) {
			concurrenciaRecorridoLocalService.update(itinerarioRecorrido.getRecorridoId(),
					fecha, itinerarioRecorrido.getHora(), solicitud.getCantidadParticipantes());
		}

		return solicitudItinerario;

	}

	public SolicitudItinerario delete(long solicitudId, Date fechaBaja, long usuarioBaja)
			throws SystemException, NoSuchSolicitudException {

		SolicitudItinerario solicitudItinerario = this.findBySolicitudId(solicitudId);

		Solicitud solicitud = solicitudPersistence.findByPrimaryKey(solicitudId);

		for (ItinerarioRecorrido itinerarioRecorrido : itinerarioRecorridoPersistence.findByItinerarioId(solicitudItinerario.getItinerarioId())) {
			concurrenciaRecorridoLocalService.update(itinerarioRecorrido.getRecorridoId(),
					solicitudItinerario.getFecha(), itinerarioRecorrido.getHora(), -solicitud.getCantidadParticipantes());
		}

		solicitud.setFechaAsignacionItinerario(null);
		
		solicitudPersistence.update(solicitud);
		
		solicitudItinerario.setFechaBaja(fechaBaja);
		solicitudItinerario.setUsuarioBaja(usuarioBaja);

		return super.updateSolicitudItinerario(solicitudItinerario);

	}

	public SolicitudItinerario findBySolicitudId(long solicitudId) throws SystemException {
		List<SolicitudItinerario> listSolicitudItinerario =
				this.solicitudItinerarioPersistence.findBySolicitudId(solicitudId);

		for (SolicitudItinerario solicitudItinerario : listSolicitudItinerario)
			if (solicitudItinerario.getFechaBaja() == null)
				return solicitudItinerario;

		return null;
	}

	public Set<Date> findFechasNoPosibles(long itinerarioId, Date fechaDesde, long cantidadPersonas)
			throws SystemException, NoSuchRecorridoException {

		Set<Date> setDate = new HashSet<Date>();

		for (ItinerarioRecorrido itinerarioRecorrido : itinerarioRecorridoPersistence.findByItinerarioId(itinerarioId)) {
			setDate.addAll(concurrenciaRecorridoLocalService.findFechasNoPosibles(itinerarioRecorrido.getRecorridoId(), itinerarioRecorrido.getHora(), fechaDesde, cantidadPersonas));
		}

		return setDate;
	}

	public List<SolicitudItinerario> findByItinerarioIdAndFechaAndFechaBaja(
			long itinerarioId, Date fecha, Date fechaBaja) throws SystemException {
		return this.solicitudItinerarioPersistence.findByItinerarioIdAndFechaAndFechaBaja(itinerarioId, fecha, fechaBaja);
	}
	
}
